home *** CD-ROM | disk | FTP | other *** search
/ CD Actual 90 / CD Actual 90.iso / Software3D / VirtualLight / VLight1.3win32.exe / VibSDK / Samples / sample3.c < prev    next >
Encoding:
C/C++ Source or Header  |  2002-10-07  |  3.7 KB  |  150 lines

  1. /*
  2.  * VirtuaLight's binary .VIB format API, sample 3
  3.  * Written by Stephane Marty, 09/10/2001
  4.  *
  5.  * This sample program writes a binary VIB file
  6.  * describing a procedural spring mesh.
  7.  */
  8.  
  9. #include "..\vlBinDef.h"
  10.  
  11. #define TWO_PI (6.283185307179586476925287)
  12.  
  13. #define NU 180
  14. #define NV 24
  15. #define R1 0.5
  16. #define R2 0.2
  17. #define PERIOD 2
  18. #define CYCLES 5
  19.  
  20. static viVECTOR
  21. normal(viVECTOR v, viVECTOR v1, viVECTOR v2)
  22. {
  23.     viVECTOR n, va, vb;
  24.  
  25.     viVecSubstract(va, v1, v);
  26.     viVecNormalize(va);
  27.     viVecSubstract(vb, v2, v);
  28.     viVecNormalize(vb);
  29.     viVecCross(n, va, vb);
  30.     viVecNormalize(n);
  31.     return(n);
  32. }
  33.  
  34. static viVECTOR
  35. evaluate(double u, double v)
  36. {
  37.     viVECTOR q;
  38.  
  39.     viSetDbl(q.x, (1.0 - R1 * cos(v)) * cos(u));
  40.     viSetDbl(q.y, (1.0 - R1 * cos(v)) * sin(u));
  41.     viSetDbl(q.z, R2 * (sin(v) + u * PERIOD / M_PI));
  42.     return(q);
  43. }
  44.  
  45. void main(void)
  46. {
  47.     unsigned long pri=0;
  48.     int i, j;
  49.     double u, v, du, dv;
  50.     viVECTOR q[4], n[4];
  51.     viPATCH            tri;
  52.     viDISK            disk;
  53.     viCAMERA        *cam;
  54.     viGENERAL        *gen;
  55.     viPOINT_LIGHT    *pl;
  56.     viFILE            *vib;
  57.    
  58.     du = CYCLES * TWO_PI / (double)NU;
  59.     dv = TWO_PI / (double)NV;
  60.  
  61.     // Open a new VIB file
  62.     vib = viNewBinaryVIB("sample3.vib");
  63.  
  64.     // Create and declare the procedural object named "smooth_spring"
  65.     viDeclareNewObject("smooth_spring", vib);
  66.     for (i=0; i<NU; i++)
  67.     {
  68.         u = i * du;
  69.         for (j=0; j<NV; j++)
  70.         {
  71.             v = j * dv;
  72.             // this object is a set of polygons, but each of them
  73.             // is divided in two triangular patches.
  74.             q[0] = evaluate(u, v);
  75.             n[0] = normal(q[0], evaluate(u+du/10, v), evaluate(u, v+dv/10));
  76.             q[1] = evaluate(u+du, v);
  77.             n[1] = normal(q[1], evaluate(u+du+du/10, v), evaluate(u+du, v+dv/10));
  78.             q[2] = evaluate(u+du, v+dv);
  79.             n[2] = normal(q[2], evaluate(u+du+du/10, v+dv), evaluate(u+du, v+dv+dv/10));
  80.             q[3] = evaluate(u, v+dv);
  81.             n[3] = normal(q[3], evaluate(u+du/10, v+dv), evaluate(u, v+dv+dv/10));
  82.             // set and dump the first triangular patch...
  83.             viCopyVector(&tri.v1, &q[0]);
  84.             viCopyVector(&tri.n1, &n[0]);
  85.             viCopyVector(&tri.v2, &q[1]);
  86.             viCopyVector(&tri.n2, &n[1]);
  87.             viCopyVector(&tri.v3, &q[2]);
  88.             viCopyVector(&tri.n3, &n[2]);
  89.             viDumpPatch(&tri, vib);
  90.             // ...and the second one (first vertex doesn't change).
  91.             viCopyVector(&tri.v2, &q[2]);
  92.             viCopyVector(&tri.n2, &n[2]);
  93.             viCopyVector(&tri.v3, &q[3]);
  94.             viCopyVector(&tri.n3, &n[3]);
  95.             viDumpPatch(&tri, vib);
  96.             pri += 2;
  97.         }
  98.     }
  99.     viEndObjectDeclaration(vib);
  100.     
  101.     // Add the camera (low adaptive antialiasing enabled)
  102.     cam = viNewCamera();
  103.     viSetInt(cam->Format.X, 256);
  104.     viSetInt(cam->Format.Y, 256);
  105.     viSetDbl(cam->FrameAspectRatio, 1.0);
  106.     viSetVector(&cam->Location, -2, -4, 5);
  107.     viSetVector(&cam->LookAt, 0, 0, 2);
  108.     viSetVector(&cam->UpAxis, 0, 0, 1);
  109.     viSetDbl(cam->FieldOfView, 60);
  110.     viSetInt(cam->Antialiasing, 1);
  111.     viDumpCamera(cam, vib);
  112.  
  113.     // Set the background color
  114.     gen = viNewGeneral();
  115.     viSetColor(&gen->Background, 0.5, 0.5, 0.5);
  116.     viDumpGeneral(gen, vib);
  117.  
  118.     // Add a key pointlight
  119.     pl = viNewPointLight();
  120.     viSetColor(&pl->Intensity, 1, 1, 1);
  121.     viSetVector(&pl->Position,
  122.         cam->Location.x*5,
  123.         cam->Location.y*2,
  124.         25);
  125.     viDumpPointLight(pl, vib);
  126.  
  127.     // Invoke the object
  128.     viCallObject("smooth_spring", vib);
  129.     viObjectShaderName("smooth_spring_shader", vib);
  130.     viEndObjectCall(vib);
  131.  
  132.     // Add a simple disk for the floor (detached from the object)
  133.     viPrimitive(vib);
  134.     viSetVector(&disk.center, 0, 0, 0);
  135.     viSetVector(&disk.normal, 0, 0, 1);
  136.     viSetDbl(disk.radius, 250);
  137.     viDumpDisk(&disk, vib);
  138.     viPrimitiveShaderName("ground", vib);
  139.     viEndPrimitive(vib);
  140.  
  141.     // Close the VIB file
  142.     viCloseBinaryVIB(vib);
  143.  
  144.     // Deallocate memory used
  145.     free(cam);
  146.     free(gen);
  147.     free(pl);
  148.  
  149.     fprintf(stderr, "\n%lu patches dumped.\n", pri);
  150. }